package com.yunsc.store.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yunsc.common.exception.YunscException;
import com.yunsc.common.utils.PageResult;
import com.yunsc.common.utils.SecurityUtil;
import com.yunsc.product.service.YunscGoodsService;
import com.yunsc.product.vo.GoodsDetailVO;
import com.yunsc.store.dao.YunscPageDao;
import com.yunsc.store.dto.PageDTO;
import com.yunsc.store.dto.QueryPageDTO;
import com.yunsc.store.entity.YunscCouponEntity;
import com.yunsc.store.entity.YunscPageEntity;
import com.yunsc.store.entity.YunscStoreSettingEntity;
import com.yunsc.store.service.YunscCouponService;
import com.yunsc.store.service.YunscPageService;
import com.yunsc.store.service.YunscStoreSettingService;
import com.yunsc.store.vo.PageDetailVO;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;


@Service("yunscPageService")
public class YunscPageServiceImpl extends ServiceImpl<YunscPageDao, YunscPageEntity> implements YunscPageService {

    @Resource
    private YunscGoodsService goodsService;
    @Resource
    private YunscStoreSettingService storeSettingService;
    @Resource
    private YunscCouponService couponService;


    // 查询页面列表
    @Override
    public PageResult<YunscPageEntity> queryPageList(QueryPageDTO params, Integer storeId) {
        LambdaQueryWrapper<YunscPageEntity> lqw = new LambdaQueryWrapper<>();
        lqw.select(YunscPageEntity::getPageId, YunscPageEntity::getPageName, YunscPageEntity::getPageType, YunscPageEntity::getCreateTime, YunscPageEntity::getUpdateTime);
        lqw.eq(YunscPageEntity::getStoreId, storeId);
        lqw.eq(YunscPageEntity::getIsDelete, 0);
        lqw.like(StringUtils.isNotEmpty(params.getSearch()), YunscPageEntity::getPageName, params.getSearch());
        Page<YunscPageEntity> page = new Page<>(params.getPage(), params.getPageSize());
        Page<YunscPageEntity> pageResult = this.page(page, lqw);
        return PageResult.formatPageResult(pageResult.getRecords(), params.getPage(), params.getPageSize(), pageResult.getTotal());
    }

    @Override
    public YunscPageEntity getPageDetail(Integer pageId) {
        YunscPageEntity page = this.getById(pageId);
        String pageDataStr = page.getPageData();
        Map map = JSON.parseObject(pageDataStr, Map.class);
        Map<String, Object> pageMap = (Map<String, Object>) map.get("page");
        PageDetailVO.PageData pageData = new PageDetailVO.PageData();

        pageData.setName((String) pageMap.get("name"));
        pageData.setType((String) pageMap.get("type"));
        pageData.setParams((Map<String, Object>) pageMap.get("params"));
        pageData.setStyle((Map<String, Object>) pageMap.get("style"));
        // JSONArray itemsJsonArray = (JSONArray) map.get("items");
        List<PageDetailVO.PageItems> items = (List<PageDetailVO.PageItems>) map.get("items");
        PageDetailVO pageDetail = new PageDetailVO();

        pageDetail.setPage(pageData);
        pageDetail.setItems(items);
        page.setPage_data(pageDetail);
        page.setPageData(null);

        return page;
    }

    @Override
    public PageDetailVO queryPageDefaultData(Integer storeId) {
        YunscStoreSettingEntity storeSettingEntity = storeSettingService.queryStoreSettingByKey("default_page", storeId);
        String defaultPageStr = storeSettingEntity.getValues();
        PageDetailVO pageDetailVO = JSON.parseObject(defaultPageStr, PageDetailVO.class);
        PageDetailVO pageDetail = new PageDetailVO();
        Map pageMap = JSON.parseObject(defaultPageStr, Map.class);
        pageDetail.setPage(JSON.parseObject(JSON.toJSONString(pageMap.get("page")), PageDetailVO.PageData.class));
        pageDetail.setItems((Map<String, Object>) pageMap.get("items"));
        return pageDetail;
    }

    @Override
    @Transactional
    public void editPage(PageDTO params) {
        Integer pageId = params.getPageId();
        YunscPageEntity pageEntity = this.getById(pageId);
        if (pageEntity == null) {
            throw new YunscException("页面不存在");
        }
        PageDetailVO pageData = params.getForm();
        PageDetailVO.PageData page = pageData.getPage();
        Map<String, Object> paramsMap = page.getParams();
        Object nameStr = paramsMap.get("name"); // 页面名称
        pageEntity.setPageName(nameStr.toString());
        pageEntity.setPageData(JSON.toJSONString(pageData));
        this.updateById(pageEntity);
    }

    @Override
    public void addPage(PageDTO params, Integer storeId) {
        PageDetailVO pageData = params.getForm();
        Map<String, Object> page = (Map<String, Object>) pageData.getPage();
        Map<String, Object> paramsMap = (Map<String, Object>) page.get("params");
        Object nameStr = paramsMap.get("name"); // 页面名称
        YunscPageEntity pageEntity = new YunscPageEntity();
        pageEntity.setPageName(nameStr.toString());
        pageEntity.setPageData(JSON.toJSONString(pageData));
        pageEntity.setStoreId(storeId);
        pageEntity.setPageType(20); // 页面类型(10首页 20自定义页)
        this.save(pageEntity);
    }

    @Override
    @Transactional
    public void deletePage(Integer pageId) {
        YunscPageEntity pageEntity = this.getById(pageId);
        if (pageEntity == null) {
            throw new YunscException("页面不存在");
        }
        // 软删除
        pageEntity.setIsDelete(1);
        this.updateById(pageEntity);
    }

    @Override
    public void setHomePage(Integer pageId) {
        Integer update = this.baseMapper.setPageHome(pageId);
        if (update < 1) {
            throw new YunscException("设置首页失败");
        }
    }

    @Override
    public PageDetailVO queryDefaultPageDetail(Integer pageId, Integer storeId) {
        YunscPageEntity pageEntity = this.getOne(new LambdaQueryWrapper<YunscPageEntity>()
                .eq(YunscPageEntity::getPageType, 10));
        if (pageEntity == null) {
            throw new YunscException("页面不存在");
        }
        String pageDataStr = pageEntity.getPageData();
        PageDetailVO pageDetail = JSON.parseObject(pageDataStr, PageDetailVO.class);
        // 获取首页数据
        Object items = pageDetail.getItems();
        List<PageDetailVO.PageItems> pageItems = JSON.parseArray(JSON.toJSONString(items), PageDetailVO.PageItems.class);
        pageItems.forEach(item -> {
            if ("goods".equals(item.getType())) {
                Map map = JSON.parseObject(item.getParams().toString(), Map.class);
                JSONObject autoJsonObj = (JSONObject) map.get("auto");
                // goodsSort: sales all price 排序方式 sales:销量  all:全部 price:价格
                Integer categoryId = autoJsonObj.getInteger("category");
                String goodsSort = autoJsonObj.getString("goodsSort");
                Integer showNum = autoJsonObj.getInteger("showNum");

                String source = map.get("source").toString();
                // 自动获取商品列表
                List<GoodsDetailVO> goodsList = null;
                if ("auto".equals(source)) {
                    // 获取商品列表
                    goodsList = goodsService.queryGoodsByCategoryId(categoryId, showNum, goodsSort);
                }
                // 手动选择商品列表
                if ("choice".equals(source)) {
                    List<Map<String, Object>> data = item.getData();
                    List<Integer> goodsIds = data.stream().map(dataItem -> {
                        return (Integer) dataItem.get("goodsId");
                    }).collect(Collectors.toList());
                    goodsList = goodsService.queryGoodsByIds(goodsIds);
                }
                item.setData(goodsList);
            }
            if ("coupon".equals(item.getType())) {
                Map map = JSON.parseObject(item.getParams().toString(), Map.class);
                Integer showNum = (Integer) map.get("showNum");
                // 获取优惠券列表
                Integer userId = SecurityUtil.getCurrentUserId();
                List<YunscCouponEntity> couponList = couponService.queryPageCouponList(userId, showNum, storeId);
                item.setData(couponList);
            }
        });
        pageDetail.setItems(pageItems);
        return pageDetail;
    }
}